// plugins/inspect.js
import inspect from 'vite-plugin-inspect'
import path from 'path'

// # 开发时启用
// ENABLE_INSPECT=1 npm run dev

// # 构建时生成 inspect 报告
// ENABLE_INSPECT_BUILD=1 npm run build

/**
 * 创建一个受控的 inspect 插件封装
 * 仅在 vite serve 模式下 + 启用环境变量时才激活
 */
export default function createInspectPlugin(userOptions = {}) {
  const defaultOptions = {
    // 默认输出目录
    outputDir: path.resolve(process.cwd(), '.vite-inspect'),
    // 建议默认关闭 build 输出，避免污染打包
    build: false,
    // 其他默认配置...
  }

  const finalOptions = { ...defaultOptions, ...userOptions }

  return {
    name: 'vite-plugin-inspect-wrapper',
    // 必须是 async 插件，因为 configureServer 是异步钩子
    apply: 'serve', // 只在 serve 模式下加载插件（可选优化）

    // 关键：根据 configEnv 决定是否返回真正的 inspect 插件
    config(config, configEnv) {
      const isDevWithInspect =
        configEnv.command === 'serve' &&
        !configEnv.isPreview &&
        !!process.env.ENABLE_INSPECT

      if (!isDevWithInspect) {
        // 不满足条件：返回空插件（不启用 inspect）
        return
      }

      // 满足条件：返回真正的 inspect 插件配置
      const inspectPlugin = inspect(finalOptions)

      // 合并插件的 config 钩子
      const originalConfig = inspectPlugin.config?.bind(inspectPlugin)
      return {
        ...originalConfig?.(config, configEnv),
        // 如果原插件有额外的 config 修改，会在这里合并
        // 我们也可以在这里注入全局 define
      }
    },

    // 转发 configureServer 钩子
    configureServer(...args) {
      // 注意：这里不能直接调用 inspect().configureServer，因为 config 阶段才决定是否启用
      // 所以我们延迟到 server 创建时再获取插件实例（通过 this.load() 或缓存）
      // 更简单做法：只在 config 中启用插件，让 Vite 自动调用
    }
  }
}